package com.zimmor.topic;

import com.rabbitmq.client.*;
import com.zimmor.util.RabbitmqUtil;

import java.io.IOException;

/**
 * @Author:zimmor
 * @Date: 2021/12/29 16:28
 * @Description 动态路由模型 消费者
 * @version: 1.0.0
 */

public class Customer1 {
    public static void main(String[] args) {
        //获取连接和通道
        Connection connection = RabbitmqUtil.getConnection();
        try {
            Channel channel = connection.createChannel();
            //声明交换机
            String exchange = "topics";
            channel.exchangeDeclare(exchange, BuiltinExchangeType.TOPIC);
            /*
             * 当交换机的type 为 topic时，routingKey可以使用通配符，进而实现灵活的动态路由方式
             * 通配符是对消费者来说的，动态路由模式对于生产者是没有通配符这种概念的
             * 通配符 * 和 #的解释，通配符一般配合 . 来使用，动态路由模式中，routingKey一般是由几个单词通过 . 来连接的，
             * * 可以匹配一个单词，多个单词被 . 分开
             * # 可以匹配多个单词
             */
            //声明RoutingKey
            String routingKey = "user.*";
 //        String routingKey = "user.#";//这种方式绑定该交换机的队列会接收到的所有消息
//        String routingKey = "*.user.*";
//        String routingKey = "#";
//        String routingKey = "";
            //获取临时队列
            String queue = channel.queueDeclare().getQueue();
            //把队列与交换机绑定
            channel.queueBind(queue, exchange, routingKey);
            //消费消息
            channel.basicConsume(queue, true, new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    System.out.println("消费者1接收到消息：" + new String(body));
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
